package com.taotao.sso.service.impl;

import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import com.taotao.mapper.TbUserMapper;
import com.taotao.po.TbUser;
import com.taotao.po.TbUserExample;
import com.taotao.po.TbUserExample.Criteria;
import com.taotao.pojo.TaotaoResult;
import com.taotao.sso.component.impl.JedisSingleImpl;
import com.taotao.sso.service.LoginService;
import com.taotao.util.CookieUtils;
import com.taotao.util.JsonUtils;

/**
 * 用户登录服务
 * 
 * @author DaiRui
 * @ClassName : LoginServiceImpl
 * @Description:
 * @date 2017年4月16日 下午5:36:20
 * @Version 1.0
 */
@Service
public class LoginServiceImpl implements LoginService {

	@Autowired
	private TbUserMapper userMapper;

	@Autowired
	private JedisSingleImpl JedisSingle;

	@Value("${REDIS_SESSION_KEY}")
	private String REDIS_SESSION_KEY;

	@Value("${SESSION_EXPIRE}")
	private Integer SESSION_EXPIRE;

	@Override
	public TaotaoResult login(String username, String password,
			HttpServletRequest request, HttpServletResponse response) {

		TbUserExample example = new TbUserExample();
		Criteria criteria = example.createCriteria();
		criteria.andUsernameEqualTo(username);
		// 把密码转为MD5加密 进行查询
		String md5Password = DigestUtils.md5DigestAsHex(password.getBytes());
		criteria.andPasswordEqualTo(md5Password);
		List<TbUser> list = userMapper.selectByExample(example);
		// 如果查不出来
		if (list == null || list.isEmpty()) {
			return TaotaoResult.build(400, "用户名或密码错误");
		}
		TbUser user = list.get(0);
		// 登录成功
		// 生成token UUID 唯一字符
		String token = UUID.randomUUID().toString();
		// 把用户信息写入redis
		// key:REDIS_SESSION:{TOKEN}
		// value:user转json
		// 安全起见，把用户密码设置为空
		user.setPassword(null);
		JedisSingle.set(REDIS_SESSION_KEY + ":" + token,
				JsonUtils.objectToJson(user));
		// 设置session的过期时间
		JedisSingle.expire(REDIS_SESSION_KEY + ":" + token, SESSION_EXPIRE);
		// 写cookie 保存在客户端，可以永久存储在本地 session保存在服务端 默认是30分钟
		CookieUtils.setCookie(request, response, "TT_TOKEN", token);
		// 返回cookie值
		return TaotaoResult.ok(token);

	}
}
